package top.xchch.tool.cipher.atguigu;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * 代码中没有演示iv向量
 */
public class DesDemo03 {
    public static void main(String[] args) throws Exception{
        // 原文
        String input = "硅谷";
        // 定义key 使用des进行加密, 密钥必须是8个字节
        String key = "12345678";
        // 算法
//        String transformation = "DES"; // 默认的加密模式是ECB, 填充模式是 PKCS5Padding
        // 算法
        // 加密模式 ECB/CBC: ECB(电子密码本) CBC(密码块链接)
        // 填充模式 NoPadding/PKCS5Padding
        String transformation = "DES/ECB/PKCS5Padding";
        // 加密类型
        String algorithm = "DES";
        // 加密
        String encryptDES = encryptDES(input, key, algorithm, transformation);
        System.out.println("加密: " + encryptDES); // 加密: qANksk5lvqM=

        // 解密
        String src = decryptDES(encryptDES, key, algorithm, transformation);
        System.out.println("解密: " + src); // 解密: 硅谷
    }

    /**
     *
     * @param input 原文
     * @param key 密钥
     * @param algorithm 类型
     * @param transformation 算法
     * @return
     * @throws Exception
     */
    private static String encryptDES(String input, String key, String algorithm
            , String transformation) throws Exception {
        // 创建加密对象
        Cipher cipher = Cipher.getInstance(transformation);
        // 创建加密规则
        // 第一个参数: key的字节
        // 第二个参数: 加密的类型
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
        // 进行加密初始化
        // 第一个参数表示模式, 加密模式或解密模式
        // 第二个参数表示: 加密的规则
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        // 调用加密方法
        byte[] bytes = cipher.doFinal(input.getBytes());
        // 如果直接打印密文会出现乱码
//        System.out.println(new String(bytes)); // �d�Ne��

        return Base64.encode(bytes);
    }

    /**
     *
     * @param key 密钥
     * @param algorithm 类型
     * @param transformation 算法
     * @return
     * @throws Exception
     */
    private static String decryptDES(String encryptDES, String key, String algorithm
            , String transformation) throws Exception {
        Cipher cipher = Cipher.getInstance(transformation);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        // 调用解密方法
        byte[] bytes = cipher.doFinal(Base64.decode(encryptDES));

        return new String(bytes);
    }
}
